/**
 * @desc 文件要使用的api
 * getSher=分享接口 third=登录接口
 * @param {getSher,third}
 *
 */
import jweixin from 'weixin-js-sdk' // 导入微信sdk
interface shareData {
  /** 标题 */
  title: string
  /** 描述 */
  desc: string
  /** 分享链接 */
  link: string
  /** 缩略图 */
  imgUrl: string
}
interface PayData {
  /** 支付签名时间戳，注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 */
  timestamp: number
  /** 支付签名随机串，不长于 32 位 */
  nonceStr: string
  /** 统一支付接口返回的prepay_id参数值，提交格式如：prepay_id=\*\*\*） */
  package: string
  /** 签名方式，默认为'SHA1'，使用新版支付需传入'MD5' */
  signType: string
  /** 支付签名 */
  paySign: string
}
/** 微信鉴权参数 */
interface wechatConfig {
  debug?: boolean
  /** 公众号的唯一标识 */
  appId?: string //
  /** 生成签名的时间戳 */
  timestamp: number //
  /** 生成签名的随机串 */
  nonceStr: string //
  /** 签名 */
  signature: string //
}
const wechat = {
  /**
   * 判断是否在微信环境
   * @returns Boolean
   */
  isWechat(): boolean {
    return /MicroMessenger/i.test(window.navigator.userAgent)
  },
  /**
   * 鉴权页面
   * @param callback 要执行的wx鉴权后的回调函数
   * @param data 鉴权信息
   * @param jsApiList 要检测的 JS 接口列表
   */
  async initJssdk(callback: (params: any) => any, data: wechatConfig, jsApiList: Array<any>) {
    jweixin.config({
      debug: data.debug,
      appId: data.appId || import.meta.env.VITE_WX_APPID, // 公众号的唯一标识
      timestamp: data.timestamp, // 生成签名的时间戳
      nonceStr: data.nonceStr, // 生成签名的随机串
      signature: data.signature, // 签名
      jsApiList, // 需要使用的JS接口列表
    })
    callback && callback(data)
    jweixin.checkJsApi({
      jsApiList, // 需要检测的 JS 接口列表，所有 JS 接口列表见附录2,
      success: function (res) {
        console.log(res, '是否可用')
        // 以键值对的形式返回，可用的 api 值true，不可用为false
        // 如：{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}
      },
    })
  },
  /**
   * 微信H5登录
   * @example
   * wechatLogin(async (code)=>{
   *  const res = await login({code})
   *  // ...代码略
   * })
   */
  wechatLogin(callback: () => Promise<any>) {
    const code = this.getUrlCode('code')
    if (this.isWechat() && code) {
      return callback.call(this, code)
    }
    this.getWeChatCode()
  },
  // 获取微信code， 静默登录
  async getWeChatCode() {
    const local = encodeURIComponent(window.location.href) // 获取当前页面地址作为回调地址
    const appid = import.meta.env.VITE_WX_APPID
    // 通过微信官方接口获取code之后，会重新刷新设置的回调地址【redirect_uri】
    window.location.href =
      'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' +
      appid +
      '&redirect_uri=' +
      local +
      '&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect'
  },
  /**
   * 截取获取code
   * @param name 要截取的key
   * @returns 截取的值
   */
  getUrlCode(name: string) {
    return (
      decodeURIComponent(
        // eslint-disable-next-line no-sparse-arrays
        (new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) || [
          ,
          '',
        ])[1].replace(/\+/g, '%20'),
      ) || null
    )
  },

  /**
   * 微信H5自定义分享
   * @param {object} data 要分享的信息
   * @param {string} data.title 标题
   * @param {string} data.desc 描述
   * @param {string} data.link 地址
   * @param {string} data.imgUrl 图片
   * @param fetchs 请求分享的信息函数
   * @param url 分享的地址
   * @example
   * const res = 请求要分享的信息()
   * share(res, 鉴权信息函数)
   */
  share(data: shareData, config: wechatConfig, url?: string) {
    url = url || window.location.href
    this.isWechat() &&
      // 每次都需要重新初始化配置，才可以进行分享
      this.initJssdk(
        (params) => {
          jweixin.ready(() => {
            const shareData = {
              title: data.title,
              desc: data.desc,
              link: url,
              imgUrl: data.imgUrl,
              success: () => {
                // 分享后的一些操作,比如分享统计等等
              },
              cancel: () => {},
            }
            // 分享给朋友接口
            // jweixin.updateAppMessageShareData(shareData);
            // //分享到朋友圈接口
            // // jweixin.updateTimelineShareData(shareData);
            jweixin.onMenuShareAppMessage(shareData) // 这2个方法是新js-sdk的方法
            jweixin.onMenuShareTimeline(shareData) // 这2个方法是新js-sdk的方法
          })
        },
        config,
        ['onMenuShareTimeline', 'onMenuShareAppMessage'],
      )
  },

  /**
   * 微信H5支付
   * @param data 支付信息
   * @param fetchs 请求鉴权函数
   * @param callback 成功后的函数
   */
  wxpay(data: PayData, config: wechatConfig, callback?: (param?: any) => any) {
    this.isWechat() &&
      this.initJssdk(
        () => {
          jweixin.ready(() => {
            jweixin.chooseWXPay({
              timestamp: data.timestamp,
              nonceStr: data.nonceStr,
              package: data.package,
              signType: data.signType,
              paySign: data.paySign,
              success: (res) => {
                callback && callback(res)
              },
              fail: (res) => {
                console.log('%c微信H5sdk,chooseWXPay失败：', 'color:green;background:yellow')
                callback && callback(res)
              },
              cancel: (res) => {},
            })
          })
        },
        config,
        [],
      )
  },
  /**
   * 微信扫一扫
   * @param success 扫码成功后的回调函数
   * @param url 地址
   */
  async scanQRCode(success: (res: any) => any, data: wechatConfig, url?: string) {
    url = url || window.location.href
    this.isWechat() &&
      this.initJssdk(
        () => {
          jweixin.ready(() => {
            jweixin.scanQRCode({
              needResult: 1,
              scanType: ['qrCode', 'barCode'],
              success: (res) => {
                // 扫码成功后的回调函数
                success(res)
              },
            })
          })
        },
        data,
        ['scanQRCode'],
      )
  },
}
export default wechat
